<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package cs5620.object;

import javax.vecmath.AxisAngle4f;
import javax.vecmath.Color3f;
import javax.vecmath.Matrix4f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import cs5620.material.IsotropicWard;
import cs5620.material.CookTorrance;
import cs5620.material.Lambertian;
import cs5620.material.Phong;

/**
 * A basic spaceship model
 * 
 * @author Revant Kapoor
 * @author Saswat Panda
 */

public class UberDestroyer implements ParameterizedObjectMaker {

	/**
	 * @see cs5620.object.ParameterizedObjectMaker#make(java.lang.Object[])
	 */
	public final HierarchicalObject make(Object... inputs) {

		if (inputs.length &gt; 4) {
			throw new Error(this.getClass().getName()
					+ ": Invalid number of parameters.");
		}
		
		Scene out = new Scene();
		out.addObject(makePlane(inputs));
		
		Group uberDestroyer = new Group("Uber-Destroyer");
		uberDestroyer.setTranslate(-0.3f, 0, 0);
		
		// Scale entire mesh
		if (inputs.length &gt; 0) {
			float factor = clamp((Float) inputs[0], -1, 1);
			uberDestroyer.setScale(1.0f, 1.0f, (factor + 4.0f) * 0.25f);
		}
		
		uberDestroyer.addObject(makeMainBody(inputs));
		uberDestroyer.addObject(makeWings(inputs));
		
		out.addObject(uberDestroyer);
		
		return out;

	}

	private HierarchicalObject makePlane(Object[] inputs) {
		
		MeshObject plane = PrimitiveFactory.makePlane("Plane");
		plane.setTranslate(0, -0.5f, 0);
		plane.setMaterial(new Phong(new Color3f(0.11f, 0.21f, 0.69f), 
				new Color3f(1.0f, 1.0f, 1.0f), 200));
		
		return plane;
	}
	
	private HierarchicalObject makeMainBody(Object[] inputs) {
		
		Group mainBody = new Group("Main Body");
		
		mainBody.addObject(makeBody(inputs));
		mainBody.addObject(makeNose(inputs));
		mainBody.addObject(makeCockpit(inputs));
		
		return mainBody;
	}

	private HierarchicalObject makeBody(Object[] inputs) {
		
		Group body = new Group("Body");
		
		MeshObject box = PrimitiveFactory.makeBox("Box");
		box.setTranslate(0.0f, 0.0f, 0.0f);
		box.setScale(0.48f, 0.06f, 0.05f);
		box.setMaterial(new IsotropicWard(new Color3f(0, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		body.addObject(box);
		
		MeshObject cylinderLeft = PrimitiveFactory.makeCylinder(5, 30, "Left Cylinder");
		cylinderLeft.setTranslate(0.12f, 0.0f, -0.05f);
		cylinderLeft.setRotationAxisAngle(90, 0, 0, 1);
		cylinderLeft.setScale(0.06f, 0.6f, 0.15f);
		cylinderLeft.setMaterial(new IsotropicWard(new Color3f(0, 0, 0),
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		body.addObject(cylinderLeft);

		MeshObject cylinderRight = PrimitiveFactory.makeCylinder(5, 30, "Right Cylinder");
		cylinderRight.setTranslate(0.12f, 0.0f, 0.05f);
		cylinderRight.setRotationAxisAngle(90, 0, 0, 1);
		cylinderRight.setScale(0.06f, 0.6f, 0.15f);
		cylinderRight.setMaterial(new IsotropicWard(new Color3f(0, 0, 0),
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		body.addObject(cylinderRight);
		
		MeshObject cone = PrimitiveFactory.makeCone(5, 30, "Center Thruster");
		cone.setRotationAxisAngle(-90, 0, 0, 1);
		cone.setTranslate(-0.30f, 0.0f, 0.0f);
		cone.setScale(0.1f, 0.20f, 0.16f);
		cone.setMaterial(new IsotropicWard(new Color3f(0.1f, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		body.addObject(cone);

		return body;
	}
	
	private HierarchicalObject makeNose(Object[] inputs) {
		
		Group nose = new Group("Nose");
		
		MeshObject cone = PrimitiveFactory.makeCone(5, 30, "Left Cone");
		cone.setRotationAxisAngle(-90, 0, 0, 1);
		cone.setTranslate(0.8f, 0.0f, 0.05f);
		cone.setScale(0.06f, 0.3f, 0.2f);
		cone.setMaterial(new IsotropicWard(new Color3f(0, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		nose.addObject(cone);
		
		MeshObject cone2 = PrimitiveFactory.makeCone(5, 30, "Right Cone");
		cone2.setRotationAxisAngle(-90, 0, 0, 1);
		cone2.setTranslate(0.8f, 0.0f, -0.05f);
		cone2.setScale(0.06f, 0.3f, 0.2f);
		cone2.setMaterial(new IsotropicWard(new Color3f(0, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		nose.addObject(cone2);
		
		return nose;
		
	}
	
	private HierarchicalObject makeCockpit(Object[] inputs) {
		
		Group cockpit = new Group("Cockpit ");
		
		//Translate Cockpit
		if (inputs.length &gt; 1) {
			float factor = clamp((Float) inputs[1], -1, 1);
			cockpit.setTranslate(factor*0.5f, 0.0f, 0.0f);
		}
		
		//Scale Cockpit
		float factor = 1.0f;
		if (inputs.length &gt; 2) {
			factor = (clamp((Float) inputs[2], -1, 1) + 2) / 2.0f;
		}
		
		MeshObject sphere = PrimitiveFactory.makeSphere(15, 15, "Sphere");
		sphere.setTranslate(0.4f, 0.03f, 0.0f);
		sphere.setScale(0.3f, factor * 0.15f, 0.15f);
		sphere.setMaterial(new IsotropicWard(new Color3f(0.05f, 0, 0),
				new Color3f(0.8f, 0.8f, 0.8f), 0.4f));
		cockpit.addObject(sphere);
		
		return cockpit;
		
	}
	

	private HierarchicalObject makeWings(Object[] inputs) {

		Group wings = new Group("Wings");
		wings.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		
		Group wingLeft = new Group("Left Wing");
		Group wingRight = new Group("Right Wing");
		
		wingRight.setRotationAxisAngle(180, 1, 0, 0);
		
		// Rotate wings
		if (inputs.length &gt; 3) {
			float factor = clamp((Float) inputs[3], -1, 1);
			wingLeft.setRotationAxisAngle(factor * 15, 1, 0, 0);
			wingRight.mulRotation(factor * -15, 1, 0, 0);
			
			if (factor &gt; 0) {
				wingLeft.setTranslate(0,0,factor * -0.1f);
				wingRight.setTranslate(0,0,factor * 0.1f);
			}
			else {
				wingLeft.setTranslate(0,0,factor * 0.1f);
				wingRight.setTranslate(0,0,factor * -0.1f);
			}
		}
		
		MeshObject box;
		
		box = PrimitiveFactory.makeBox("Fragment 1");
		box.setTranslate(0.32f, 0.0f, -0.07f);
		box.setRotationAxisAngle(-8.23f, 0, 1, 0);
		box.setScale(0.28f, 0.02f, 0.15f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 2");
		box.setTranslate(0.11f, 0.0f, -0.12f);
		box.setRotationAxisAngle(-13.12f, 0, 1, 0);
		box.setScale(0.52f, 0.02f, 0.15f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 3");
		box.setTranslate(0.11f, 0.0f, -0.12f);
		box.setRotationAxisAngle(-19.19f, 0, 1, 0);
		box.setScale(0.52f, 0.02f, 0.15f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 4");
		box.setTranslate(-0.07f, 0.0f, -0.19f);
		box.setRotationAxisAngle(-26.83f, 0, 1, 0);
		box.setScale(0.3f, 0.02f, 0.15f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 5");
		box.setTranslate(-0.19f, 0.0f, -0.27f);
		box.setRotationAxisAngle(-41.72f, 0, 1, 0);
		box.setScale(0.15f, 0.02f, 0.15f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 6");
		box.setTranslate(-0.23f, 0.0f, -0.46f);
		box.setRotationAxisAngle(-54.06f, 0, 1, 0);
		box.setScale(0.16f, 0.02f, 0.05f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 7");
		box.setTranslate(-0.37f, 0.0f, -0.56f);
		box.setRotationAxisAngle(-38.39f, 0, 1, 0);
		box.setScale(0.03f, 0.02f, 0.10f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 8");
		box.setTranslate(-0.38f, 0.0f, -0.59f);
		box.setRotationAxisAngle(-20.57f, 0, 1, 0);
		box.setScale(0.03f, 0.02f, 0.08f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 9");
		box.setTranslate(-0.43f, 0.0f, -0.275f);
		box.setRotationAxisAngle(0, 0, 1, 0);
		box.setScale(0.05f, 0.02f, 0.4f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		box = PrimitiveFactory.makeBox("Fragment 10");
		box.setTranslate(-0.38f, 0.0f, -0.28f);
		box.setRotationAxisAngle(0, 0, 1, 0);
		box.setScale(0.1f, 0.02f, 0.3f);
		box.setMaterial(new IsotropicWard(new Color3f(0.1f, 0.1f, 0.1f), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		wingLeft.addObject(box);
		wingRight.addObject(box);
		
		//Create the Thrusters
		Group thrustersLeft = new Group("Thrusters");
		Group thrustersRight = new Group("Thrusters");
		
		MeshObject cone = PrimitiveFactory.makeCone(2, 30, "Far");
		cone.setRotationAxisAngle(-90, 0, 0, 1);
		cone.setTranslate(-0.435f, 0.0f, -0.55f);
		cone.setScale(0.05f, 0.06f, 0.07f);
		cone.setMaterial(new IsotropicWard(new Color3f(0.1f, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		thrustersLeft.addObject(cone);
		thrustersRight.addObject(copyCone(cone));
		
		cone = PrimitiveFactory.makeCone(2, 30, "Close");
		cone.setRotationAxisAngle(-90, 0, 0, 1);
		cone.setTranslate(-0.375f, 0.0f, -0.32f);
		cone.setScale(0.055f, 0.12f, 0.08f);
		cone.setMaterial(new IsotropicWard(new Color3f(0.1f, 0, 0), 
				new Color3f(1.0f, 1.0f, 1.0f), 0.4f));
		thrustersLeft.addObject(cone);
		thrustersRight.addObject(copyCone(cone));
		
		wingLeft.addObject(thrustersLeft);
		wingRight.addObject(thrustersRight);
		
		wings.addObject(wingLeft);
		wings.addObject(wingRight);
		
		return wings;
	}
	
	/* Clamps the value of val to [min, max] */
	private float clamp(float val, float min, float max) {
		float retVal = Math.min(val, max);
		retVal = Math.max(retVal, min);
		return retVal;
	}
	
	/* Returns a copy of the give cone */
	private MeshObject copyCone(MeshObject cone) {
		
		MeshObject retVal = PrimitiveFactory.makeCone(2, 30, cone.name);
		
		retVal.setRotation(cone.getRotation());
		retVal.setTranslate(cone.getTranslate());
		retVal.setScale(cone.getScale());
		retVal.setMaterial(cone.getMaterial());
		
		return retVal;
	}
}
</pre></body></html>